﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MailServer.Recipient
{
    /// <summary>
    /// Clase Lista Para Almacenar los mensajes
    /// </summary>
    [Serializable]
    public class MessageList
    {
        private List<Message.Message> messages;
        /// <summary>
        /// Constructor
        /// </summary>
        public MessageList()
        {
            messages = new List<Message.Message>();
        }
        /// <summary>
        /// Metodo para agregar un mensaje a la lista
        /// </summary>
        /// <param name="message"></param>
        public void Add(Message.Message message)
        {
            if (Contains(message))
                return;
            messages.Add(message);
        }
        /// <summary>
        /// Devuelve un elemento de los mensajes de un usuario
        /// </summary>
        /// <param name="user">Usuario</param>
        /// <param name="index">Elemento</param>
        /// <returns>Devuelve un elemento de un mensaje</returns>
        public Message.Message ElementAt(string user, int index)
        {
            var l = messages
                .Where(message => message
                .CheckTo(user));
            if (l.Count() > index)
                return l.ElementAt(index);
            return null;
        }
        /// <summary>
        /// Verifica si un elemento existe
        /// </summary>
        /// <param name="message">Mensaje</param>
        /// <returns>Devuelve true o false si el elemento existe</returns>
        public bool Contains(Message.Message message)
        {
            return messages.Where(theMessage =>
                theMessage.ToString() == message.ToString())
                .Count() > 0;
        }
        /// <summary>
        /// Metodo que devuelve la cantidad Mensajes por usuarios
        /// </summary>
        /// <param name="user">Usuarios</param>
        /// <returns>Cantidad de mensajes</returns>
        public int Count(string user)
        {
            return messages
                    .Where(message =>
                    message.CheckTo(user))
                    .Count();
        }
        /// <summary>
        /// Metodo que lista los mensajes de un usuario
        /// </summary>
        /// <param name="user">Usuario</param>
        /// <returns>Lista de Mensajes</returns>
        public List<Message.Message> List(string user)
        {
            return messages
                    .Where(message =>
                    message.CheckTo(user))
                    .ToList();
        }

        public List<Message.Message> ListFrom(string user, string from) {
            return messages
                    .Where(message =>
                    message.CheckTo(user) &&
                    message.CheckFrom(from))
                    .ToList();
        }

        /// <summary>
        /// Metodo que obtiene un Mensaje
        /// </summary>
        /// <param name="message">mensaje a obtener</param>
        /// <returns></returns>
        private Message.Message Get(Message.Message message)
        {
            return messages.Where(theMessage =>
                theMessage.ToString() == message.ToString())
                .FirstOrDefault();
        }
        /// <summary>
        /// metodo que elimina un mensaje
        /// </summary>
        /// <param name="message">Mensaje a eliminar</param>
        public void Remove(Message.Message message)
        {
            if (Contains(message))
                messages.Remove(Get(message));
        }
    }
}